Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor[process_queue]: wait for process preprocessing before completely executing #26

Merged
merged 2 commits into from
Oct 16, 2024

Conversation

ArslanSaleem
Copy link
Collaborator

@ArslanSaleem ArslanSaleem commented Oct 16, 2024

Summary by CodeRabbit

  • New Features

    • Introduced a new ProcessScheduler for efficient process management and execution.
    • Added linting commands to improve code quality checks.
  • Bug Fixes

    • Enhanced logic for handling process steps to ensure only ready tasks are processed.
  • Tests

    • Implemented a comprehensive suite of unit tests for the ProcessScheduler to validate its functionality.
  • Chores

    • Updated project dependencies to include the schedule package.

@ArslanSaleem ArslanSaleem requested a review from gventuri October 16, 2024 14:00
Copy link
Contributor

coderabbitai bot commented Oct 16, 2024

Walkthrough

The changes introduced in this pull request enhance the backend functionality by adding new features and improving existing processes. A Makefile now includes targets for linting code. A new ProcessScheduler class has been implemented to manage process execution, supported by modifications to the process_queue.py file for better process handling. Additionally, a new repository function for querying process steps with asset content has been added, and a new dependency has been introduced in the pyproject.toml. Comprehensive unit tests for the ProcessScheduler have also been created.

Changes

File Change Summary
backend/Makefile Added new targets: lint (to check code) and lint-fix (to auto-correct linting issues).
backend/app/processing/process_queue.py Updated submit_process method signature, added ProcessScheduler instance, and modified process handling logic.
backend/app/processing/process_scheduler.py Introduced ProcessScheduler class with methods for managing process execution and scheduling.
backend/app/repositories/process_repository.py Added get_process_steps_with_asset_content function for querying process steps by status.
backend/pyproject.toml Added dependency: schedule = "^1.2.2" to the project.
backend/tests/processing/test_process_scheduler.py Created unit tests for ProcessScheduler class to validate its functionality and behavior.

Possibly related PRs

Suggested reviewers

  • gventuri

Poem

In the burrow deep, where the code does play,
New targets for linting have come out to stay.
A scheduler hops, keeping processes in line,
With tests all around, our code will shine!
So let’s celebrate with a joyful cheer,
For clean code and order, we hold so dear! 🐇✨


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@codecov-commenter
Copy link

codecov-commenter commented Oct 16, 2024

Codecov Report

Attention: Patch coverage is 82.75862% with 10 lines in your changes missing coverage. Please review.

Project coverage is 54.09%. Comparing base (2d0254f) to head (13f0b93).

Files with missing lines Patch % Lines
backend/app/processing/process_queue.py 33.33% 8 Missing ⚠️
backend/app/processing/process_scheduler.py 97.67% 1 Missing ⚠️
backend/app/repositories/process_repository.py 66.66% 1 Missing ⚠️
Additional details and impacted files
@@                Coverage Diff                 @@
##           release/v0.2.2      #26      +/-   ##
==================================================
+ Coverage           53.11%   54.09%   +0.98%     
==================================================
  Files                  36       37       +1     
  Lines                1751     1806      +55     
==================================================
+ Hits                  930      977      +47     
- Misses                821      829       +8     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 10

🧹 Outside diff range and nitpick comments (8)
backend/Makefile (1)

Line range hint 1-1: Add test target to .PHONY directive

The test target should be included in the .PHONY directive to ensure it always runs, regardless of whether a file named "test" exists in the directory.

Consider updating the .PHONY directive as follows:

-.PHONY: run migrate upgrade
+.PHONY: run migrate upgrade test

Also applies to: 14-14

backend/app/repositories/process_repository.py (1)

Line range hint 1-105: Summary of changes and request for additional context

The addition of the get_process_steps_with_asset_content function appears to be a specialized version of the existing get_process_steps function. While it provides more specific querying capabilities, including filtering by status and loading asset content, it's not clear from the context provided why this new function was necessary.

To ensure that this change aligns with the best practices and overall architecture of the application, could you please provide more information on:

  1. The specific use case that prompted the creation of this new function.
  2. Why the existing get_process_steps function couldn't be modified or extended to accommodate this new requirement.
  3. Are there any performance considerations for loading the asset content that influenced this decision?

This additional context will help in evaluating whether this is the most appropriate solution or if there might be alternative approaches worth considering.

backend/tests/processing/test_process_scheduler.py (4)

11-21: LGTM with a suggestion: Consider adding more assertions.

The test_add_process_to_queue method effectively verifies the basic functionality of adding a process to the queue. The use of patch to mock time.sleep is a good practice to prevent unnecessary delays during testing.

Suggestion for improvement:
Consider adding assertions to verify:

  1. The length of the waiting_processes list increased by 1.
  2. The scheduler_running flag is set to True after adding the process.

These additional checks would provide more comprehensive coverage of the method's behavior.


23-35: LGTM with a suggestion: Add assertion for queue state after processing.

The test_reprocess_holding_processes method effectively verifies the core functionality of processing a queued item. The assertions check both the execution of the process and the logging behavior.

Suggestion for improvement:
Add an assertion to verify that the waiting_processes list is empty after processing. This would ensure that the process is removed from the queue after execution:

self.assertEqual(len(self.scheduler.waiting_processes), 0)

This additional check would provide more comprehensive coverage of the method's behavior.


37-139: LGTM: Comprehensive test coverage with a suggestion for additional tests.

The test methods cover a wide range of scenarios, providing good coverage of the ProcessScheduler's functionality. Each test focuses on a specific behavior, and the use of mocking and patching is consistent throughout.

Suggestions for additional tests:

  1. Test error handling: Add tests to verify how the scheduler handles exceptions thrown by the executor.
  2. Test concurrency: If the ProcessScheduler is designed to handle concurrent processes, add tests to verify this behavior.
  3. Test edge cases: Consider adding tests for edge cases such as very large queue sizes or long-running processes.

These additional tests would further enhance the robustness of your test suite.


1-141: Overall: Well-structured and comprehensive test suite with room for minor improvements.

This test suite for the ProcessScheduler class is well-designed and covers a wide range of scenarios. The consistent use of mocking and patching demonstrates good testing practices.

Areas for potential improvement:

  1. Consider adding more granular assertions in some tests to verify internal state changes.
  2. Explore adding tests for error handling and edge cases.
  3. If applicable, consider adding tests for concurrent processing scenarios.

These enhancements would further strengthen an already robust test suite.

backend/app/processing/process_queue.py (1)

58-60: Add a comment to explain the early return condition.

The condition checks if the process step is already completed and not of type "extract," leading to an early return. Adding a comment would clarify the purpose of this logic.

backend/app/processing/process_scheduler.py (1)

77-77: Correct the comment to reflect the actual wait time

The comment mentions "Wait 2 minutes," but the time.sleep(300) call actually waits for 5 minutes (300 seconds). Update the comment to match the code.

-    time.sleep(300)  # Wait 2 minutes to observe scheduler stopping when empty
+    time.sleep(300)  # Wait 5 minutes to observe scheduler stopping when empty

Alternatively, adjust the sleep time to 120 seconds to match the 2-minute comment:

-    time.sleep(300)  # Wait 2 minutes to observe scheduler stopping when empty
+    time.sleep(120)  # Wait 2 minutes to observe scheduler stopping when empty
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between 2d0254f and e08fc37.

⛔ Files ignored due to path filters (1)
  • backend/poetry.lock is excluded by !**/*.lock
📒 Files selected for processing (6)
  • backend/Makefile (1 hunks)
  • backend/app/processing/process_queue.py (7 hunks)
  • backend/app/processing/process_scheduler.py (1 hunks)
  • backend/app/repositories/process_repository.py (2 hunks)
  • backend/pyproject.toml (1 hunks)
  • backend/tests/processing/test_process_scheduler.py (1 hunks)
🧰 Additional context used
🔇 Additional comments (10)
backend/Makefile (1)

Line range hint 1-20: LGTM! Makefile improvements enhance development workflow

The additions to the Makefile are well-implemented and provide valuable linting capabilities to the project. These changes will help maintain code quality and consistency. The new targets integrate well with the existing ones and follow the established patterns in the Makefile.

Great job on improving the development workflow! The new linting targets will be particularly useful for maintaining code quality across the project.

backend/pyproject.toml (1)

20-20: LGTM! Verify usage of the new dependency.

The addition of the schedule package (version ^1.2.2) aligns well with the PR objectives of refactoring the process queue. This lightweight scheduler is suitable for managing process execution timing, potentially in the new ProcessScheduler class mentioned in the AI summary.

To ensure proper integration, please run the following script to verify the usage of the schedule package in the codebase:

This will help confirm that the new dependency is being utilized as intended in the implementation.

✅ Verification successful

Verified Usage of 'schedule' Package

The schedule package (version ^1.2.2) has been successfully imported and utilized in backend/app/processing/process_scheduler.py. Specifically, schedule.every() and schedule.run_pending() functions are employed in the ProcessScheduler class to manage process execution timing.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the usage of the 'schedule' package in the codebase

# Test: Search for import statements of 'schedule'
echo "Searching for 'schedule' import statements:"
rg --type python "^import schedule|^from schedule import"

# Test: Search for usage of 'schedule' functions
echo -e "\nSearching for 'schedule' function usage:"
rg --type python "schedule\.(every|run_pending|run_all|clear)"

Length of output: 392


Script:

#!/bin/bash
# Description: Verify the usage of the 'schedule' package in Python files within the codebase

# Test: Search for import statements of 'schedule'
echo "Searching for 'schedule' import statements in Python files:"
rg --glob "*.py" "^import schedule|^from schedule import"

# Test: Search for usage of 'schedule' functions
echo -e "\nSearching for 'schedule' function usage in Python files:"
rg --glob "*.py" "schedule\.(every|run_pending|run_all|clear)"

Length of output: 652

backend/app/repositories/process_repository.py (1)

95-105: 🛠️ Refactor suggestion

Consider enhancing the new function for clarity and flexibility.

The new get_process_steps_with_asset_content function provides more specific querying capabilities compared to the existing get_process_steps function. However, there are a few suggestions for improvement:

  1. The function name could be more descriptive, e.g., get_process_steps_by_status_with_asset_content.
  2. Consider adding a default value for the status parameter to allow querying all statuses if needed.
  3. Add a docstring to explain the function's purpose, parameters, and return value.

Here's a suggested implementation with these improvements:

def get_process_steps_by_status_with_asset_content(
    db: Session,
    process_id: int,
    status: List[ProcessStatus] = None
) -> List[models.ProcessStep]:
    """
    Retrieve process steps for a given process, filtered by status, including asset content.

    Args:
        db (Session): The database session.
        process_id (int): The ID of the process to query.
        status (List[ProcessStatus], optional): List of statuses to filter by. If None, all statuses are included.

    Returns:
        List[models.ProcessStep]: A list of ProcessStep objects with related entities loaded.
    """
    query = db.query(models.ProcessStep).filter(models.ProcessStep.process_id == process_id)
    
    if status:
        query = query.filter(models.ProcessStep.status.in_(status))
    
    return query.options(
        joinedload(models.ProcessStep.process).joinedload(models.Process.project),
        joinedload(models.ProcessStep.asset).joinedload(models.Asset.content),
    ).all()

Could you please clarify the specific use case for this new function? Understanding its purpose will help ensure it meets the requirements effectively.

✅ Verification successful

Let's try searching for the function usage by targeting Python files directly.


Verification Successful: Function Usage Confirmed

The get_process_steps_with_asset_content function is actively used in backend/app/processing/process_queue.py, ensuring that its introduction serves a functional purpose within the codebase.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Find usages of the new function to understand its context

# Test: Search for function calls
rg --type python -A 5 'get_process_steps_with_asset_content'

Length of output: 91


Script:

#!/bin/bash
# Description: Find usages of the new function to understand its context

# Search for function calls in Python files
rg 'get_process_steps_with_asset_content' --glob "*.py" -A 5

Length of output: 1179

backend/tests/processing/test_process_scheduler.py (3)

1-5: LGTM: Imports and class definition are appropriate.

The import statements and class definition are well-structured for unit testing with mocking. The TestProcessScheduler class correctly inherits from unittest.TestCase.


6-9: LGTM: setUp method is well-implemented.

The setUp method correctly initializes mock objects and creates a ProcessScheduler instance, following best practices for unit testing. This setup allows for isolated testing of the ProcessScheduler class.


140-141: LGTM: Standard main block for running tests.

The inclusion of the if __name__ == '__main__': block is a good practice, allowing the tests to be run directly or the file to be imported as a module.

backend/app/processing/process_queue.py (3)

6-7: Imports are appropriate for the new functionality.

The added imports of AssetProcessingStatus and ProcessScheduler are necessary for the process management enhancements.


34-34: Adding return type annotation improves clarity.

Specifying -> None in the submit_process function enhances code readability and supports static type checking.


38-38: ProcessScheduler initialization is correctly implemented.

The process_execution_scheduler is properly instantiated with the specified interval and callback function.

backend/app/processing/process_scheduler.py (1)

21-21: Ensure scheduled jobs are properly configured in a multi-threaded environment

The schedule module is not inherently thread-safe when modifying jobs. Since you're scheduling tasks and running them in separate threads, there might be concurrency issues. Consider using thread-safe scheduling alternatives or ensuring that scheduling and job execution occur within the same thread.

To verify if there are potential issues, you can check for thread safety concerns in the schedule module usage.

backend/Makefile Outdated Show resolved Hide resolved
backend/app/processing/process_queue.py Outdated Show resolved Hide resolved
backend/app/processing/process_queue.py Outdated Show resolved Hide resolved
backend/app/processing/process_queue.py Outdated Show resolved Hide resolved
backend/app/processing/process_scheduler.py Outdated Show resolved Hide resolved
backend/app/processing/process_scheduler.py Show resolved Hide resolved
backend/app/processing/process_scheduler.py Outdated Show resolved Hide resolved
backend/app/processing/process_scheduler.py Outdated Show resolved Hide resolved
backend/app/processing/process_scheduler.py Outdated Show resolved Hide resolved
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Outside diff range and nitpick comments (6)
backend/app/processing/process_queue.py (6)

6-7: LGTM! Consider adding documentation for ProcessScheduler usage.

The addition of AssetProcessingStatus and ProcessScheduler imports, along with the ProcessScheduler initialization, suggests an improved approach to managing process execution. This change looks good and aligns with the PR objectives.

To enhance maintainability, consider adding a brief comment explaining the purpose and configuration of the ProcessScheduler instance.

Also applies to: 38-39


58-60: LGTM! Consider using an enum for process types.

The addition of the condition process.type != "extract" before appending the summary is a good refinement of the logic. It aligns with the PR objective of refactoring the process queue.

To improve code maintainability and reduce the risk of typos, consider using an enum for process types instead of string literals. For example:

from enum import Enum

class ProcessType(Enum):
    EXTRACT = "extract"
    # Add other process types here

# Then use it like this:
if process.type != ProcessType.EXTRACT.value:
    summaries.append(process_step.output.get("summary", ""))

Line range hint 139-154: LGTM! Improved process step handling.

The changes to the process_task function significantly improve the handling of process steps:

  1. Fetching only relevant process steps (PENDING and IN_PROGRESS) is more efficient.
  2. The introduction of ready_process_steps ensures that only steps with completed asset content are processed.
  3. The all_process_steps_ready check allows for better control flow.

These changes align well with the PR objective of refactoring the process queue and waiting for process preprocessing before execution.

Consider renaming the variable all_process_steps_ready to all_process_steps_completed for better clarity, as it checks for completed asset processing rather than general readiness.

Also applies to: 165-165


197-202: LGTM! Improved process status handling.

The addition of the all_process_steps_ready check before updating the process status is a crucial improvement. It ensures that:

  1. Processes are not marked as completed prematurely.
  2. Processes with pending steps are added to a waiting queue for later execution.

This change directly implements the PR objective of waiting for process preprocessing before execution.

Consider adding a log message when the process is completed successfully, similar to the log message for when steps are missing. This would provide consistent logging throughout the process lifecycle.


139-139: Address remaining suggestions from past reviews.

While some past review suggestions have been addressed, a couple of items remain:

  1. The use of string literals for ProcessStepStatus (e.g., "PENDING", "IN_PROGRESS") could be replaced with enumeration constants for better maintainability.
  2. The variable all_process_steps_ready could be renamed to all_process_steps_completed for grammatical correctness and clarity.

The concern about premature status updates has been effectively addressed with the new logic (lines 197-202).

Consider implementing these remaining suggestions to further improve code quality and maintainability.

Also applies to: 153-153


Line range hint 1-389: Consider further refactoring for improved code structure.

While the changes in this PR have significantly improved the process queue handling, there are some general structural improvements that could be considered:

  1. Some functions, particularly process_task and extract_process, are quite long and complex. Consider breaking these down into smaller, more focused functions.
  2. The mix of function definitions and class instantiations at the module level could be reorganized for better readability. Consider grouping related functions and moving class instantiations to a separate initialization function or module.
  3. Error handling could potentially be more granular, especially in the longer functions, to provide more specific error messages and recovery strategies.

These suggestions are not critical for the current PR but could be considered for future refactoring efforts to improve overall code maintainability.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Files that changed from the base of the PR and between e08fc37 and 13f0b93.

📒 Files selected for processing (3)
  • backend/Makefile (1 hunks)
  • backend/app/processing/process_queue.py (7 hunks)
  • backend/app/processing/process_scheduler.py (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • backend/Makefile
🧰 Additional context used
🔇 Additional comments (9)
backend/app/processing/process_scheduler.py (8)

1-5: LGTM: Import statements are well-organized and relevant.

The import statements are correctly organized, with standard library imports first, followed by local imports. All imported modules and classes are relevant to the functionality of the ProcessScheduler class.


7-14: LGTM: Well-defined class with informative docstring.

The ProcessScheduler class is well-named and follows proper naming conventions. The docstring provides a clear and comprehensive explanation of the class's purpose and behavior, which is excellent for maintainability and usability.


15-26: LGTM: Well-implemented initialization method.

The __init__ method is well-structured and initializes all necessary components:

  • It correctly sets up instance variables.
  • Creates a lock for thread safety.
  • Handles the optional logger parameter gracefully.
  • Sets up the scheduler with the provided interval.

This implementation provides a good foundation for the class's functionality.


28-36: LGTM: Well-implemented internal processing method.

The _reprocess_holding_processes method is correctly implemented:

  • It uses a lock to ensure thread safety when accessing shared resources.
  • The logic for processing tasks and stopping the scheduler when the queue is empty is sound.
  • Appropriate logging is used to track execution.

This implementation helps maintain the integrity of the process queue and conserves resources when no tasks are pending.


38-42: LGTM: Efficient implementation of the scheduler loop.

The _run_scheduler method is well-implemented:

  • It correctly uses a while loop controlled by the scheduler_running flag, allowing for controlled stopping of the scheduler.
  • The method runs pending scheduled tasks efficiently.
  • The 1-second sleep between iterations prevents excessive CPU usage.

This implementation provides a good balance between responsiveness and resource usage.


44-59: LGTM: Well-implemented start and stop methods.

The start_scheduler and stop_scheduler methods are correctly implemented:

  • start_scheduler checks if the scheduler is already running before starting a new thread, preventing duplicate threads.
  • The scheduler thread is set as a daemon thread, which is good for automatic cleanup when the main program exits.
  • stop_scheduler uses a simple and effective method to stop the scheduler by setting the running flag to False.
  • Both methods use appropriate logging to track the scheduler's state changes.

These methods provide good control over the scheduler's lifecycle.


60-65: LGTM: Well-implemented method for adding processes to the queue.

The add_process_to_queue method is correctly implemented:

  • It uses a lock to ensure thread safety when modifying the shared queue.
  • The method logs the addition of the process, which is good for tracking and debugging.
  • It calls start_scheduler after adding the process, ensuring that the scheduler is running to process the newly added task.

This implementation provides a thread-safe and efficient way to add new processes to the queue.


1-65: Excellent implementation of the ProcessScheduler class.

The ProcessScheduler class is a well-designed and robust solution for managing a queue of processes to be executed. Key strengths of this implementation include:

  1. Thread-safety: Proper use of locks to prevent race conditions.
  2. Resource conservation: The scheduler automatically stops when the queue is empty.
  3. Clear control methods: Well-implemented start, stop, and add process methods.
  4. Good documentation: Comprehensive docstrings and appropriate logging.
  5. Efficient design: Balances responsiveness and CPU usage in the scheduler loop.

This implementation provides a solid foundation for managing process execution in a multi-threaded environment. Great job!

backend/app/processing/process_queue.py (1)

34-35: LGTM! Improved type hinting.

The addition of the return type annotation -> None to the submit_process function signature enhances code clarity and supports static type checking. This is a good practice that aligns with Python type hinting conventions.

@gventuri gventuri merged commit 0b9956c into release/v0.2.2 Oct 16, 2024
5 checks passed
@gventuri gventuri deleted the improve/process_queue branch October 16, 2024 15:13
gventuri pushed a commit that referenced this pull request Oct 16, 2024
…tely executing (#26)

* chore[processes]: wait for process preprocessing before comple
tely executing

* fix[process_queue]: code improvements
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants